Home:ALL Converter>findFirstVisibleItemPositions doesn't work for recycleview android

findFirstVisibleItemPositions doesn't work for recycleview android

Ask Time:2015-04-06T07:48:53         Author:user3535747

Json Formatter

I have this code:

mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        int[] firstVisibleItemPositions = new int[getResources().getInteger(R.integer.news_numbers_column)]; 
        int pastVisiblesItems = ((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(firstVisibleItemPositions)[0];
    }
});

When I scroll my recycleview I get this error:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.support.v7.widget.OrientationHelper.getStartAfterPadding()' on a null object reference
at android.support.v7.widget.StaggeredGridLayoutManager$Span.findOneVisibleChild(StaggeredGridLayoutManager.java:2177)
at android.support.v7.widget.StaggeredGridLayoutManager$Span.findFirstVisibleItemPosition(StaggeredGridLayoutManager.java:2153)
at android.support.v7.widget.StaggeredGridLayoutManager.findFirstVisibleItemPositions(StaggeredGridLayoutManager.java:806)
at info.lanouvelletribune.apps.android.ui.fragments.NewsFragment$1.onScrollStateChanged(NewsFragment.java:90)
at android.support.v7.widget.RecyclerView.setScrollState(RecyclerView.java:751)
at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:1535)
at com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView.onInterceptTouchEvent(ObservableRecyclerView.java:188)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2060)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2390)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1741)
at android.app.Activity.dispatchTouchEvent(Activity.java:2826)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2351)
at android.view.View.dispatchPointerEvent(View.java:8590)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4098)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3964)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3541)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3515)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3541)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3617)
at android

How can I do to handle this error and get the first visible item position?

Author:user3535747,eproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/29463560/findfirstvisibleitempositions-doesnt-work-for-recycleview-android
TalkLittle :

This is a bug in the RecyclerView StaggeredGridLayoutManager:\n\nhttps://code.google.com/p/android/issues/detail?id=180521\n\nhttps://code.google.com/p/android/issues/detail?id=181461\n\nA workaround is to try/catch the exception:\n\ntry {\n ((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(firstVisibleItemPositions);\n} catch (NullPointerException ex) {\n // workaround for RecyclerView bug. assume not laid out, so no items visible\n firstVisibleItemPositions[0] = RecyclerView.NO_POSITION;\n firstVisibleItemPositions[1] = RecyclerView.NO_POSITION;\n}\n",
2016-01-19T04:37:32
varotariya vajsi :

If you are using StaggeredGridLayoutManager you can find findLastVisibleItemPositions like below:\n\nint visibleThreshold =1;\nfinal StaggeredGridLayoutManager linearLayoutManager = (StaggeredGridLayoutManager) mRecyclerViewAllPost.getLayoutManager();\n mRecyclerViewAllPost.addOnScrollListener(new RecyclerView.OnScrollListener() {\n @Override\n public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n super.onScrolled(recyclerView, dx, dy);\n\n int[] lastVisibleItemPositions = linearLayoutManager.findLastVisibleItemPositions(null);\n int lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions);\n int totalItemCount = linearLayoutManager.getItemCount();\n if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {\n print(\"load more item \");\n isLoading = true;\n }\n }\n });\n\n\nand getLastVisibleItem method as below:\n\npublic int getLastVisibleItem(int[] lastVisibleItemPositions) {\n int maxSize = 0;\n for (int i = 0; i < lastVisibleItemPositions.length; i++) {\n if (i == 0) {\n maxSize = lastVisibleItemPositions[i];\n }\n else if (lastVisibleItemPositions[i] > maxSize) {\n maxSize = lastVisibleItemPositions[i];\n }\n }\n return maxSize;\n}\n",
2017-08-19T07:19:51
zed007 :

I tested it with this code and it works fine with me \n\nint positionView = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();\n\n\nI used the recycle view parameter.",
2015-04-06T08:56:23
Ankit Aggarwal :

Try this:\n\nint position = layoutManager.findFirstVisibleItemPositions(null)[0];\n\n\nwhere layoutManager is what you set in your recyclerview.\n\nFor example,\n\nlayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);\nmrecyclerView.setLayoutManager(layoutManager );\n",
2015-04-09T04:43:44
smarteist :

Use these two methods :\n\n /**\n * @return Last visible item position for staggeredGridLayoutManager\n */\n private int getLastVisibleItem(int[] lastVisibleItemPositions) {\n int maxSize = 0;\n for (int position : lastVisibleItemPositions) {\n if (position > maxSize) {\n maxSize = position;\n }\n }\n return maxSize;\n }\n\n /**\n * @return First visible item position for staggeredGridLayoutManager\n */\n private int getFirstVisibleItem(int[] firstVisibleItemPositions) {\n int minSize = 0;\n if (firstVisibleItemPositions.length > 0) {\n minSize = firstVisibleItemPositions[0];\n for (int position : firstVisibleItemPositions) {\n if (position < minSize) {\n minSize = position;\n }\n }\n }\n return minSize;\n }\n\n\nand getLastVisibleItem method as below:\n\n int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(null);\n int[] firstVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(null);\n // get maximum element within the list\n lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions);\n firstVisibleItem = getFirstVisibleItem(firstVisibleItemPositions);\n",
2019-05-25T15:33:27
user3793358 :

You can use this : \n\nint[] firstVisibleItemPositions = new int[yourNumberOfColumns];\nint pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItem‌​Positions)[0];\n",
2016-11-26T19:12:55
yy